﻿#region Copyright (c) Koolwired Solutions, LLC.
/*--------------------------------------------------------------------------
 * Copyright (c) 2006, Koolwired Solutions, LLC.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer. 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution. 
 * Neither the name of Koolwired Solutions, LLC. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *--------------------------------------------------------------------------*/
#endregion

#region History
/*--------------------------------------------------------------------------
 * Modification History: 
 * Date       Programmer      Description
 * 07/20/10   Keith Kikta     Inital release.
 *--------------------------------------------------------------------------*/
#endregion

namespace Koolwired.Imap
{
    internal class ImapRegularExpressions
    {
        internal const string PARSE_UNTAG = @"^*\s(?<RESPONSE>.*)$";
        /*
         * ^kw(?<TAG>\d+)\s
         * (?<RESPONSE>\w+)\s
         * .*$
         */
        internal const string PARSE_TAG = @"^kw(?<TAG>\d+)\s(?<RESPONSE>.*)$";
        internal const string PARSE_OK = @"^(\*\sOK|kw\d+\sOK)\s.*$";
        internal const string OK_COMPLETE = @"^kw\d+\WOK\W([Ff][Ee][Tt][Cc][Hh]\W|[Ll][Ii][Ss][Tt]\W|)[Cc][Oo][Mm][Pp][Ll][Ee][Tt][Ee]([Dd]|)";
        internal const string OK_SUCCESS = @"kw\d+\WOK [Ss][Uu][Cc][Cc][Ee][Ss][Ss]$";
        internal const string FETCH_NOT_OK = @"^kw\d+\W(NO|BAD)";
        internal const string MULTI_LINE_MESSAGE = @"^.*\{\d+\}$";
        internal const string EXPUNGE_COMPLETE = @"^kw\d+\WOK\W([Ee][Xx][Pp][Uu][Nn][Gg][Ee]\W|)[Cc][Oo][Mm][Pp][Ll][Ee][Tt][Ee]([Dd]|)";
        internal const string PARSE_MAILBOX_READWRITE = @"^(OK|kw\d+\sOK)\s.*[Rr][Ee][Aa][Dd][\\-][Ww][Rr][Ii][Tt][Ee].*$";
        /*
         * ^\*\s(?<ID>\d+)\s
         * FETCH\s
         * \(UID\s(?<UID>\d+)\).*$
         */
        internal const string PARSE_FETCH_UID = @"^\*\s(?<ID>\d+)\s[Ff][Ee][Tt][Cc][Hh]\s\(UID\s(?<UID>\d+)\).*$";
        /*
         * \*\s(?<ID>\d+)\s
         * FETCH\s(\(|)
         * FLAGS\s\((?<FLAGS>[^\)]*)\)\s
         * INTERNALDATE\s\"(?<RECEIVED>[^\"]+)\"\s
         * RFC822.SIZE\s(?<SIZE>\d+)\s
         * ENVELOPE\s\(
         * \"(?<SENT>([^\"]*|NIL))\"\s
         * (?<SUBJECT>([^\(]*|NIL))
         * (\((?<FROM>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<FROM>NIL))\s
         * (\((?<SENDER>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<SENDER>NIL))\s
         * (\((?<REPLY>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<REPLY>NIL))\s
         * (\((?<TO>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<TO>NIL))\s
         * (\((?<CC>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<CC>NIL))\s
         * (\((?<BCC>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<BCC>NIL))\s
         * (?<REFERENCE>\"<([^>]+)>\"|NIL)\s
         * (?<MESSAGEID>\"<([^>]+)>\"|NIL)\)(\)|)
         */
        internal const string PARSE_FETCH_ALL = @"\*\s(?<ID>\d+)\sFETCH\s(\(|)FLAGS\s\((?<FLAGS>[^\)]*)\)\sINTERNALDATE\s\""(?<RECEIVED>[^\""]+)\""\sRFC822.SIZE\s(?<SIZE>\d+)\sENVELOPE\s\(\""(?<SENT>([^\""]*|NIL))\""\s(?<SUBJECT>([^\(]*|NIL))(\((?<FROM>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<FROM>NIL))\s(\((?<SENDER>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<SENDER>NIL))\s(\((?<REPLY>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<REPLY>NIL))\s(\((?<TO>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<TO>NIL))\s(\((?<CC>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<CC>NIL))\s(\((?<BCC>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<BCC>NIL))\s(?<REFERENCE>\""<([^>]+)>\""|NIL)\s(?<MESSAGEID>\""<([^>]+)>\""|NIL)\)(\)|)$";
        /*
         * ^\*\s(?<ID>\d+)\s
         * FETCH\s
         * \(BODYSTRUCTURE\s
         * \(
         * (?<PARTS>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)\)|(?<PARTS>NIL)\)
         * \)$
         * */
        internal const string PARSE_FETCH_BODYSTRUCTURE = @"^\*\s(?<ID>\d+)\sFETCH\s\(BODYSTRUCTURE\s(?<PARTS>(?>\((?<LEVEL>)|\)(?<-LEVEL>)|(?! \( | \) ).)+(?(LEVEL)(?!)))\)|(?<PARTS>NIL)\)$";
    }
}